From 524ce7f88e26a498c43729f99fda564f5e222582 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Fri, 19 Apr 2013 13:59:58 +0100 Subject: [PATCH] wayland: Cache the discovery connection and reuse if possible This will prevent us opening, closing and reopening the same display connection in the majority of cases. https://bugzilla.gnome.org/show_bug.cgi?id=694465 --- gdk/wayland/gdkdisplay-wayland.c | 7 +---- gdk/wayland/gdkdisplaymanager-wayland.c | 40 +++++++++++++++++++++---- gdk/wayland/gdkprivate-wayland.h | 2 +- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c index ee42ea9c8d..06bbf49225 100644 --- a/gdk/wayland/gdkdisplay-wayland.c +++ b/gdk/wayland/gdkdisplay-wayland.c @@ -214,18 +214,13 @@ log_handler(const char *format, va_list args) } GdkDisplay * -_gdk_wayland_display_open (const gchar *display_name) +_gdk_wayland_display_open (struct wl_display *wl_display) { - struct wl_display *wl_display; GdkDisplay *display; GdkWaylandDisplay *display_wayland; wl_log_set_handler_client(log_handler); - wl_display = wl_display_connect(display_name); - if (!wl_display) - return NULL; - display = g_object_new (GDK_TYPE_WAYLAND_DISPLAY, NULL); display_wayland = GDK_WAYLAND_DISPLAY (display); diff --git a/gdk/wayland/gdkdisplaymanager-wayland.c b/gdk/wayland/gdkdisplaymanager-wayland.c index 902ac164b0..f5b664c333 100644 --- a/gdk/wayland/gdkdisplaymanager-wayland.c +++ b/gdk/wayland/gdkdisplaymanager-wayland.c @@ -34,6 +34,10 @@ struct _GdkWaylandDisplayManager GSList *displays; gboolean init_failed; + struct { + struct wl_display *wl_display; + gchar *name; + } cached_display; }; struct _GdkWaylandDisplayManagerClass @@ -51,6 +55,7 @@ gdk_wayland_display_manager_initable_init (GInitable *initable, GCancellable *cancellable, GError **error) { + GdkWaylandDisplayManager *manager = GDK_WAYLAND_DISPLAY_MANAGER (initable); struct wl_display *wl_display; /* Set by the compositor when launching a special client - and it gets reset @@ -64,12 +69,12 @@ gdk_wayland_display_manager_initable_init (GInitable *initable, if (!wl_display) { - GDK_WAYLAND_DISPLAY_MANAGER (initable)->init_failed = TRUE; + manager->init_failed = TRUE; return FALSE; } - wl_display_disconnect (wl_display); - + manager->cached_display.name = g_strdup (gdk_get_display_arg_name ()); + manager->cached_display.wl_display = wl_display; return TRUE; } @@ -89,10 +94,35 @@ gdk_wayland_display_manager_finalize (GObject *object) } static GdkDisplay * -gdk_wayland_display_manager_open_display (GdkDisplayManager *manager, +gdk_wayland_display_manager_open_display (GdkDisplayManager *display_manager, const gchar *name) { - return _gdk_wayland_display_open (name); + GdkWaylandDisplayManager *manager = GDK_WAYLAND_DISPLAY_MANAGER (display_manager); + struct wl_display *wl_display; + + if (name == manager->cached_display.name || + g_strcmp0 (name, manager->cached_display.name)) + { + /* Cache hit */ + wl_display = manager->cached_display.wl_display; + } + + if (!wl_display) + { + /* Cache miss */ + if (manager->cached_display.wl_display) + wl_display_disconnect (manager->cached_display.wl_display); + wl_display = wl_display_connect (name); + } + + /* Use the cache at most once */ + g_free (manager->cached_display.name); + manager->cached_display.wl_display = NULL; + + if (!wl_display) + return NULL; + + return _gdk_wayland_display_open (wl_display); } static void diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h index 02d5b6dcaf..dc7f0039ef 100644 --- a/gdk/wayland/gdkprivate-wayland.h +++ b/gdk/wayland/gdkprivate-wayland.h @@ -155,7 +155,7 @@ void _gdk_wayland_display_queue_events (GdkDisplay *display); GdkAppLaunchContext *_gdk_wayland_display_get_app_launch_context (GdkDisplay *display); -GdkDisplay *_gdk_wayland_display_open (const gchar *display_name); +GdkDisplay *_gdk_wayland_display_open (struct wl_display *display); GdkWindow *_gdk_wayland_screen_create_root_window (GdkScreen *screen, int width, -- 2.30.2